/**
 * @file    app_communication.h
 * @author  yhy
 * @brief   通信系统
 * @version 1.00
 * @date    2025-07-20
 *
 * @copyright Copyright (c) 2025
 *
 */
#ifndef __APP_COMMUNICATION_H__
#define __APP_COMMUNICATION_H__

#include "common_msg_queue.h"

#include <stdbool.h>
#include <stdint.h>

#define SEAT_POSITION_DRIVER
// #define SEAT_POSITION_ASSIST

#ifdef SEAT_POSITION_DRIVER
#define CAN_RECV_FRAME_TYPE_COUNT 2U /* CAN接收2种ID的CAN帧 */
#define CAN_SEND_FRAME_TYPE_COUNT 6U /* CAN发送6种ID的CAN帧 */
#endif

#define SENSOR_BASE_ID 0x310         /* 传感器ID基础值 */
#define SENSOR_MAX_ID  0x319         /* 传感器ID最大值 */

/**
 * @brief 臀部骶骨手动调节状态
 *
 */
typedef enum
{
    HIP_UP_STATE_FRONT = 1U,
    HIP_UP_STATE_REAR  = 2U,
    HIP_UP_STATE_KEEP  = 3U,
} hip_up_state_e;

/**
 * @brief 臀部软硬调节状态
 *
 */
typedef enum
{
    HIP_DOWN_STATE_UP   = 1U,
    HIP_DOWN_STATE_DOWN = 2U,
    HIP_DOWN_STATE_KEEP = 3U,
} hip_down_state_e;

/**
 * @brief 腰托前后手动调节状态
 *
 */
typedef enum
{
    LUMBAR_F_R_STATE_INVALID    = 0U,
    LUMBAR_F_R_STATE_MOVE_FRONT = 1U,
    LUMBAR_F_R_STATE_MOVE_REAR  = 2U,
    LUMBAR_F_R_STATE_KEEP       = 3U,
} lumbar_f_r_manual_state_e;

/**
 * @brief 腰托上下手动调节状态
 *
 */
typedef enum
{
    LUMBAR_U_D_STATE_INVALID   = 0U,
    LUMBAR_U_D_STATE_MOVE_UP   = 1U,
    LUMBAR_U_D_STATE_MOVE_DOWN = 2U,
    LUMBAR_U_D_STATE_KEEP      = 3U,
} lumbar_u_d_manual_state_e;

/**
 * @brief 消息帧索引枚举
 *
 */
typedef enum
{
    FRAME_IDX_0 = 0U,
    FRAME_IDX_1,
    FRAME_IDX_2,
    FRAME_IDX_3,
    FRAME_IDX_4,
    FRAME_IDX_5,
} frame_idx_e;

#pragma pack(1)

typedef struct
{
    uint32_t can_id; /*!< CAN ID 0x111 */
    union
    {
        uint8_t bytes[8];
        struct
        {
            /* byte[0] 0-7 */
            uint64_t sas_switch_request         : 2; /*!< 自适应功能开关指令 0-1 */
            uint64_t sas_drvmode_switch_request : 2; /*!< 关联驾驶模式功能开关指令 2-3 */
            uint64_t dr_sas_request_pneumatic   : 4; /*!< 自适应调节指令 4-7 */

            /* byte[1] 8-15 */
            uint64_t user_id                                  : 3; /*!< 乘客ID 8-10 */
            uint64_t dr_heater_cooler_sw_pneumatic            : 3; /*!< 主驾座椅通风加热指令 11-13 */
            uint64_t dr_thighsupport_manual_request_pneumatic : 2; /*!< 腿部手动调节指令 14-15 */

            /* byte[2] 16-23 */
            uint64_t dr_bolstersupport_manual_request_pneumatic : 2; /*!< 侧翼手动调节指令 16-17 */
            uint64_t dr_lumbar_f_r_manual_request_pneumatic     : 2; /*!<  腰托前后手动调节指令 18-19 */
            uint64_t dr_lumbar_u_d_manual_request_pneumatic     : 2; /*!<  腰托上下手动调节指令 20-21 */
            uint64_t dr_highsupport_manual_request_up_pneumatic : 2; /*!<  臀部骶骨气袋手动调节指令 22-23 */

            /* byte[3] 24-31 */
            uint64_t
                dr_highsupport_manual_request_down_pneumatic : 2; /*!< 臀部软硬调节气袋手动调节指令 24-25 */
            uint64_t
                dr_highsupport_manual_request_mid_pneumatic : 2;  /*!< 臀部中间双层气袋手动调节指令 26-27 */
            uint64_t dr_sas_memory_set_request_drvive_pneumatic  : 1; /*!< 驾驶位自适应记忆设置指令 28 */
            uint64_t dr_sas_memory_set_request_off_pneumatic     : 1; /*!< 离车位自适应记忆设置指令 29 */
            uint64_t dr_sas_memory_set_request_relax_pneumatic   : 1; /*!< 休息位自适应记忆设置指令 30 */
            uint64_t dr_sas_memory_set_request_reserve_pneumatic : 1; /*!< 备用位自适应记忆设置指令 31 */

            /* byte[4] 32-39 */
            uint64_t
                dr_sas_memory_recall_request_drvive_pneumatic   : 2; /*!< 驾驶位自适应记忆执行指令 32-33 */
            uint64_t dr_sas_memory_recall_request_off_pneumatic : 2; /*!< 离车位自适应记忆执行指令 34-35 */
            uint64_t
                dr_sas_memory_recall_request_relax_pneumatic : 2;    /*!< 休息位自适应记忆执行指令 36-37 */
            uint64_t
                dr_sas_memory_recall_request_reserve_pneumatic : 2;  /*!< 备用位自适应记忆执行指令 38-39 */

            /* byte[5] 40-47 */
            uint64_t drv_mode_state                            : 2; /*!< 驾驶模式 40-41 */
            uint64_t dr_massage_mode_request_pneumatic         : 4; /*!< 主驾按摩模式指令 42-45 */
            uint64_t dr_massage_intensity_request_pneumatic    : 2; /*!< 主驾按摩力度指令 46-47 */
            /* byte[6] 48-54 */
            uint64_t dr_massage_time_request_pneumatic         : 3; /*!< 主驾按摩时间指令 48-50 */
            uint64_t dr_massage_switch_request_pneumatic       : 2; /*!< 主驾按摩开关指令 51-52 */
            uint64_t dr_massage_popup_switch_request_pneumatic : 2; /*!< 按摩弹窗开关指令 53-54 */

            /* byte[6] 55, byte[7] 56-63 */
            uint64_t driverseat_thinking_request_pneumatic : 4; /*!< 冥想模式指令 55-58 */
            uint64_t vehiclepower_pneumatic                : 2; /*!< 整车电源状态 59-60 */
            uint64_t dr_showroom_state_sps                 : 2; /*!< 主驾展厅模式状态 61-62 */
            uint64_t reserve1                              : 1; /*!< 备用位 63 */
        } signal;
    } __attribute__((packed)) can_data_u;
} __attribute__((packed)) hvs_fl_req1_t;
#pragma pack()

#pragma pack(1)
typedef struct
{
    uint32_t can_id; /*!< CAN ID 0x112 */
    union
    {
        uint8_t bytes[8];
        struct
        {
            /* byte[0] 0-5 */
            uint64_t dr_massage_ctrl_request_1_pneumatic : 3; /*!< #1按摩气袋控制 0-2 */
            uint64_t dr_massage_ctrl_request_2_pneumatic : 3; /*!< #2按摩气袋控制 3-5 */

            /* byte[0] 6-7, byte[1] 8-14 */
            uint64_t dr_massage_ctrl_request_3_pneumatic : 3; /*!< #3按摩气袋控制 6-8 */
            uint64_t dr_massage_ctrl_request_4_pneumatic : 3; /*!< #4按摩气袋控制 9-11 */
            uint64_t dr_massage_ctrl_request_5_pneumatic : 3; /*!< #5按摩气袋控制 12-14 */

            /* byte[1] 15, byte[2] 16-23 */
            uint64_t dr_massage_ctrl_request_6_pneumatic : 3; /*!< #6按摩气袋控制 15-17 */
            uint64_t dr_massage_ctrl_request_7_pneumatic : 3; /*!< #7按摩气袋控制 18-20 */
            uint64_t dr_massage_ctrl_request_8_pneumatic : 3; /*!< #8按摩气袋控制 21-23 */

            /* byte[3] 24-29 */
            uint64_t dr_massage_ctrl_request_9_pneumatic  : 3; /*!< #9按摩气袋控制 24-26 */
            uint64_t dr_massage_ctrl_request_10_pneumatic : 3; /*!< #10按摩气袋控制 27-29 */

            /* byte[3] 30-31, byte[4] 32-39 */
            uint64_t dr_massage_ctrl_request_11_pneumatic : 3; /*!< #11按摩气袋控制 30-32 */
            uint64_t dr_massage_ctrl_request_12_pneumatic : 3; /*!< #12按摩气袋控制 33-35 */
            uint64_t dr_hip_mode1_request_pneumatic       : 2; /*!< 臀部模式1指令 36-37 */
            uint64_t dr_hip_mode2_request_pneumatic       : 2; /*!< 臀部模式2指令 38-39 */

            /* byte[5] 40-47 */
            uint64_t dr_hip_mode3_request_pneumatic           : 2; /*!< 臀部模式3指令 40-41 */
            uint64_t dr_hip_mode4_request_pneumatic           : 2; /*!< 臀部模式4指令 42-43 */
            uint64_t dr_thighsupport_ctrl_request_pneumatic   : 2; /*!< 腿部自动调节指令 44-45 */
            uint64_t dr_bolstersupport_ctrl_request_pneumatic : 2; /*!< 侧翼自动调节指令 46-47 */

            /* byte[6] 48-55 */
            uint64_t dr_lumbar_up_ctrl_request_pneumatic : 2; /*!< 腰托上气袋自动调节指令（前后） 48-49 */
            uint64_t dr_lumbar_dn_ctrl_request_pneumatic : 2; /*!< 腰托下气袋自动调节指令（上下） 50-51 */
            uint64_t dr_highsupport_ctrl_request_up_pneumatic : 2; /*!< 臀部骶骨气袋自动调节指令 52-53 */
            uint64_t
                dr_highsupport_ctrl_request_down_pneumatic : 2; /*!< 臀部软硬调节气袋自动调节指令 54-55 */

            /* byte[7] 56-63 */
            uint64_t
                dr_highsupport_ctrl_request_mid_pneumatic : 2; /*!< 臀部软硬调节气袋自动调节指令 56-57 */
            uint64_t reserve1                             : 6; /*!< 备用位 58-63 */

        } __attribute__((packed)) signal;
    } can_data_u;
} __attribute__((packed)) hvs_fl_req2_t;
#pragma pack()

#pragma pack(1)
typedef struct
{
    uint32_t can_id; /*!< CAN ID 0x151 */
    union
    {
        uint8_t bytes[8];
        struct
        {
            /* byte[0] 0-7 */
            uint64_t sas_drvmode_switch_state_pneumatic : 2; /*!< 自适应关联驾驶模式功能开关状态 0-1 */
            uint64_t dr_sas_state_pneumatic             : 4; /*!< 自适应调节状态 2-5 */
            uint64_t dr_sas_pneumatic_to_sps_pneumatic  : 2; /*!< 首次乘坐调节指令 6-7 */

            /* byte[1] 8-15 */
            uint64_t dr_heater_cooler_sw_feedback_pneumatic : 3; /*!< 主驾座椅通风加热状态反馈 8-10 */
            uint64_t reserve1                               : 1; /*!< 备用位 11 */
            uint64_t dr_thighsupport_ctrl_state_pneumatic   : 2; /*!< 腿部支撑状态 12-13 */
            uint64_t dr_bolstersupport_ctrl_state_pneumatic : 2; /*!< 侧翼支撑状态 14-15 */

            /* byte[2] 16-23 */
            uint64_t dr_lumbar_ctrl_state_up_pneumatic      : 2; /*!< 腰托上气袋支撑状态 16-17 */
            uint64_t dr_lumbar_ctrl_state_down_pneumatic    : 2; /*!< 腰托下气袋支撑状态 18-19 */
            uint64_t dr_highsupport_ctrl_state_up_pneumatic : 2; /*!< 臀部支撑状态 up表示骶骨气袋 20-21 */
            uint64_t
                dr_highsupport_ctrl_state_down_pneumatic : 2;    /*!< 臀部支撑状态 down表示下排气袋 22-23 */

            /* byte[3] 24-31 */
            uint64_t dr_highsupport_ctrl_state_mid_pneumatic : 2; /*!< 臀部支撑状态 mid表示中排气袋 24-25 */
            uint64_t dr_thighsupport_manual_state_pneumatic  : 2; /*!< 腿部手动调节状态 26-27 */
            uint64_t dr_bolstersupport_manual_state_pneumatic : 2; /*!< 侧翼手动调节状态 28-29 */
            uint64_t dr_lumbar_f_r_manual_state_pneumatic     : 2; /*!< 腰托前后手动调节状态 30-31 */

            /* byte[4] 32-39 */
            uint64_t dr_lumbar_u_d_manual_state_pneumatic     : 2; /*!< 腰托上下手动调节状态 32-33 */
            uint64_t dr_highsupport_manual_state_up_pneumatic : 2; /*!< 臀部骶骨手动调节状态 34-35 */
            uint64_t
                dr_highsupport_manual_state_down_pneumatic : 2;    /*!<
                                                                      臀部硬度调节前后端两个大气袋手动调节状态
                                                                      36-37 */
            uint64_t
                dr_hipsupport_manual_state_mid_pneumatic : 2; /*!< 臀部中间左右双层气袋手动调节状态 38-39 */

            /* byte[5] 40-47 */
            uint64_t dr_sas_memory_set_state_driver_pneumatic  : 2; /*!< 驾驶位自适应记忆设置状态 40-41 */
            uint64_t dr_sas_memory_set_state_off_pneumatic     : 2; /*!< 离开位自适应记忆设置状态 42-43 */
            uint64_t dr_sas_memory_set_state_relax_pneumatic   : 2; /*!< 休息位自适应记忆设置状态 44-45 */
            uint64_t dr_sas_memory_set_state_reserve_pneumatic : 2; /*!< 备用位自适应记忆设置状态 46-47 */

            /* byte[6] 48-55 */
            uint64_t dr_air_pressure_memory_recall_state_pneumatic : 2; /*!< 气压达到记忆值 48-49 */
            uint64_t dr_sas_memory_recall_state_driver_pneumatic : 2; /*!< 驾驶位自适应记忆执行状态 50-51 */
            uint64_t dr_sas_memory_recall_state_off_pneumatic    : 2; /*!< 离开位自适应记忆执行状态 52-53 */
            uint64_t dr_sas_memory_recall_state_relax_pneumatic  : 2; /*!< 休息位自适应记忆执行状态 54-55 */

            /* byte[7] 56-63 */
            uint64_t
                dr_sas_memory_recall_state_reserve_pneumatic : 2; /*!< 备用位自适应记忆执行状态 56-57 */
            uint64_t sas_switch_state                        : 2; /*!< 自适应功能开关状态 58-59 */
            uint64_t reserve2                                : 4; /*!< 备用位 60-63 */
        } signal;
    } __attribute__((packed)) can_data_u;
} __attribute__((packed)) hvs_fl_sts1_t;
#pragma pack()

#pragma pack(1)
typedef struct
{
    uint32_t can_id; /*!< CAN ID 0x152 */
    union
    {
        uint8_t bytes[8];
        struct
        {
            /* byte[0] 0-5 */
            uint64_t dr_massage_ctrl_status_1_pneumatic : 3; /*!< #1按摩气袋控制 0-2 */
            uint64_t dr_massage_ctrl_status_2_pneumatic : 3; /*!< #2按摩气袋控制 3-5 */

            /* byte[0] 6-7, byte[1] 8-14 */
            uint64_t dr_massage_ctrl_status_3_pneumatic : 3; /*!< #3按摩气袋控制 6-8 */
            uint64_t dr_massage_ctrl_status_4_pneumatic : 3; /*!< #4按摩气袋控制 9-11 */
            uint64_t dr_massage_ctrl_status_5_pneumatic : 3; /*!< #5按摩气袋控制 12-14 */

            /* byte[1] 15, byte[2] 16-23 */
            uint64_t dr_massage_ctrl_status_6_pneumatic : 3; /*!< #6按摩气袋控制 15-17 */
            uint64_t dr_massage_ctrl_status_7_pneumatic : 3; /*!< #7按摩气袋控制 18-20 */
            uint64_t dr_massage_ctrl_status_8_pneumatic : 3; /*!< #8按摩气袋控制 21-23 */

            /* byte[3] 24-29 */
            uint64_t dr_massage_ctrl_status_9_pneumatic  : 3; /*!< #9按摩气袋控制 24-26 */
            uint64_t dr_massage_ctrl_status_10_pneumatic : 3; /*!< #10按摩气袋控制 27-29 */

            /* byte[3] 30-31, byte[4] 32-39 */
            uint64_t dr_massage_ctrl_status_11_pneumatic : 3; /*!< #11按摩气袋控制 30-32 */
            uint64_t dr_massage_ctrl_status_12_pneumatic : 3; /*!< #12按摩气袋控制 33-35 */
            uint64_t dr_massage_mode_state_pneumatic     : 4; /*!< 主驾按摩模式状态 36-39 */

            /* byte[5] 40-47 */
            uint64_t dr_massage_intensity_state_pneumatic : 2; /*!< 主驾按摩力度状态 40-41 */
            uint64_t dr_massage_time_state_pneumatic      : 3; /*!< 主驾按摩时长状态 42-44 */
            uint64_t dr_massage_switch_state_pneumatic    : 3; /*!< 主驾按摩开关状态 45-47 */

            /* byte[6] 48-53 */
            uint64_t dr_massage_popup_switch_state_pneumatic  : 2; /*!< 按摩弹出开关状态 48-49 */
            uint64_t driverseat_thinkingmode_status_pneumatic : 4; /*!< 冥想模式反馈 50-53 */

            /* byte[6] 54-55, byte[7] 56-63 */
            uint64_t dr_massage_physicalswitch_state : 3; /*!< 主驾腰托按摩开关按键状态 54-56 */
            uint64_t reserve1                        : 7; /*!< 备用位 57-63 */

        } signal;
    } __attribute__((packed)) can_data_u;
} __attribute__((packed)) hvs_fl_sts2_t;
#pragma pack()

#pragma pack(1)
typedef struct
{
    uint32_t can_id; /*!< CAN ID 0x153 */
    union
    {
        uint8_t bytes[8];
        struct
        {
            /* byte[0] 0-7 */
            uint8_t software_version_1_0; /*!< 软件版本 0-7 */

            /* byte[1] 8-15 */
            uint8_t software_version_1_1; /*!< 软件版本 8-15 */

            /* byte[2] 16-23 */
            uint8_t software_version_1_2; /*!< 软件版本 16-23 */

            /* byte[3] 24-31 */
            uint8_t software_version_1_3; /*!< 软件版本 24-31 */

            /* byte[4] 32-39 */
            uint8_t dr_lumbar_up_support_air_pressure_valve; /*!< 腰托上气袋气压值 32-39 */

            /* byte[5] 40-47 */
            uint8_t dr_lumbar_down_support_air_pressure_valve; /*!< 腰托下气袋气压值 40-47 */

            /* byte[6] 48-55 */
            uint8_t dr_thigh_support_air_pressure_valve; /*!< 腿托气袋气压值 48-55 */

            /* byte[7] 56-63 */
            uint8_t dr_boloster_support_air_pressure_valve; /*!< 侧翼大气袋支撑气压值 56-63 */
        } signal;
    } __attribute__((packed)) can_data_u;
} __attribute__((packed)) hvs_fl_sts3_t;
#pragma pack()

#pragma pack(1)
typedef struct
{
    uint32_t can_id; /*!< CAN ID 0x154 */
    union
    {
        uint8_t bytes[8];
        struct
        {
            /* byte[0] 0-7 */
            uint8_t dr_hightvolt_fault    : 1; /*!< 主驾过压故障 0 */
            uint8_t dr_lowvolt_fault      : 1; /*!< 主驾欠压故障 1 */
            uint8_t dr_eculinternal_fault : 1; /*!< ecu内部故障 2 */
            uint8_t dr_heatopen_fault     : 1; /*!< 主驾加热供电回路开路故障 3 */
            uint8_t dr_heatshort_fault    : 1; /*!< 主驾加热供电回路短路/过流故障 4 */
            uint8_t dr_ntcopen_fault      : 1; /*!< 主驾NTC开路故障 5 */
            uint8_t dr_ntcshort_fault     : 1; /*!< 主驾NTC短路故障 6 */
            uint8_t dr_fanopen_fault      : 1; /*!< 主驾风扇供电回路开路故障 7 */

            /* byte[1] 8-15 */
            uint8_t dr_fanshort_fault               : 1; /*!< 主驾风扇供电回路短路/过流故障 8 */
            uint8_t dr_pumpopen_fault               : 1; /*!< 主驾气泵供电回路开路故障 9 */
            uint8_t dr_pumpshort_fault              : 1; /*!< 主驾气泵供电回路短路/过流故障 10 */
            uint8_t dr_physickey_fault              : 1; /*!< 主驾物理按键粘滞故障 11 */
            uint8_t dr_thighsupport_bladder_fault   : 1; /*!< 主驾腿托气袋故障 12 */
            uint8_t dr_bolstersupport_bladder_fault : 1; /*!< 主驾侧翼气袋故障 13 */
            uint8_t dr_lumbar_up_bladder_fault      : 1; /*!< 主驾腰托上气袋故障 14 */
            uint8_t dr_lumbar_down_bladder_fault    : 1; /*!< 主驾腰托下气袋故障 15 */

            /* byte[2] 16-23 */
            uint8_t dr_bolster_left_bladder_fault  : 1; /*!< 主驾转向支撑左气袋故障 16 */
            uint8_t dr_bolster_right_bladder_fault : 1; /*!< 主驾转向支撑右气袋故障 17 */
            uint8_t dr_all_functions_fault         : 1; /*!< 主驾所有功能故障 18 */
            uint8_t reserve1                       : 5; /*!< 备用位 19-23 */

            /* byte[3] */
            uint8_t reserve2; /*!< 备用位 24-31 */

            /* byte[4] */
            uint8_t reserve3; /*!< 备用位 32-39 */

            /* byte[5] */
            uint8_t reserve4; /*!< 备用位 40-47 */

            /* byte[6] */
            uint8_t reserve5; /*!< 备用位 48-55 */

            /* byte[7] */
            uint8_t reserve6; /*!< 备用位 56-63 */
        } signal;
    } __attribute__((packed)) can_data_u;
} __attribute__((packed)) hvs_fl_sts4_t;
#pragma pack()

#pragma pack(1)
typedef struct
{
    uint32_t can_id; /*!< CAN ID 0x155 */
    union
    {
        uint8_t bytes[8];
        struct
        {
            /* byte[0] 0-7 */
            uint8_t dr_boloster_left_air_pressure_valve; /*!< 左侧翼小气袋气压值 0-7 */

            /* byte[1] 8-15 */
            uint8_t dr_boloster_right_air_pressure_valve; /*!< 右侧翼小气袋气压值 8-15 */

            /* byte[2] 16-23 */
            uint8_t dr_hip_up_support_air_pressure_value; /*!< 臀部上气袋气压值 16-23 */

            /* byte[3] 24-31 */
            uint8_t dr_hip_mid_support_air_pressure_value; /*!< 臀部中气袋气压值 24-31 */

            /* byte[4] 32-39 */
            uint8_t dr_hip_down_support_air_pressure_value; /*!< 臀部下气袋气压值 32-39 */

            /* byte[5] 40-47 */
            uint8_t dr_external_air_pressure_value; /*!< 外部大气压值 40-47 */

            /* byte[6] 48-55 */
            uint8_t dr_hip_mode1_status_pneumatic : 2; /*!< 臀部模式1状态 48-49 */
            uint8_t dr_hip_mode2_status_pneumatic : 2; /*!< 臀部模式2状态 50-51 */
            uint8_t dr_hip_mode3_status_pneumatic : 2; /*!< 臀部模式3状态 52-53 */
            uint8_t dr_hip_mode4_status_pneumatic : 2; /*!< 臀部模式4状态 54-55 */

            /* byte[7] 56-63 */
            uint8_t reserve1; /*!< 备用位 56-63 */
        } signal;
    } __attribute__((packed)) can_data_u;
} __attribute__((packed)) hvs_fl_sts5_t;
#pragma pack()

#pragma pack(1)
typedef struct
{
    uint32_t can_id; /*!< CAN ID 0x161 */
    union
    {
        uint8_t bytes[8];
        struct
        {
            /* byte[0] 0-7 */
            uint8_t as_heater_cooler_sw_feedback_pneumatic : 3; /*!< 副驾座椅通风加热状态反馈 0-2 */
            uint8_t as_lumbar_f_r_manual_state_pneumatic_l : 2; /*!< 副驾腰托前后手动调节状态 3-4 */
            uint8_t as_lumbar_u_d_manual_state_pneumatic_l : 2; /*!< 副驾腰托上下手动调节状态 5-6 */
            uint8_t reserve1                               : 1; /*!< 备用位 7 */

            /* byte[1] 8-15 */
            uint8_t as_seat_thinkingmode_status_pneumatic_l : 4; /*!< 副驾冥想模式反馈 8-11 */
            uint8_t as_massage_physicalswitch_state_l       : 3; /*!< 副驾按摩开关按键状态 12-14 */
            uint8_t reserve2                                : 1; /*!< 备用位 15 */

            /* byte[2] 16-23 */
            uint8_t as_lumbar_up_bladder_fault_l   : 1; /*!< 副驾腰托上气袋故障 16 */
            uint8_t as_lumbar_down_bladder_fault_l : 1; /*!< 副驾腰托下气袋故障 17 */
            uint8_t as_heatopen_fault_l            : 1; /*!< 副驾加热供电回路开路故障 18 */
            uint8_t as_heatshort_fault_l           : 1; /*!< 副驾加热供电回路短路/过流故障 19 */
            uint8_t as_ntcopen_fault_l             : 1; /*!< 副驾NTC开路故障 20 */
            uint8_t as_ntcshort_fault_l            : 1; /*!< 副驾NTC短路/过流故障 21 */
            uint8_t as_fanopen_fault_l             : 1; /*!< 副驾风扇供电回路开路故障 22 */
            uint8_t as_fanshort_fault_l            : 1; /*!< 副驾风扇供电回路短路/过流故障 23 */

            /* byte[3] 24-31 */
            uint8_t as_pumpopen_fault_l      : 1; /*!< 副驾气泵供电回路开路故障 24 */
            uint8_t as_pumpshort_fault_l     : 1; /*!< 副驾气泵供电回路短路/过流故障 25 */
            uint8_t as_physickey_fault_l     : 1; /*!< 副驾物理按键粘滞故障 26 */
            uint8_t as_all_functions_fault_l : 1; /*!< 副驾所有功能故障 27 */
            uint8_t reserve3                 : 4; /*!< 备用位 28-31 */

            /* byte[4] */
            uint8_t reserve4; /*!< 备用位 32-39 */

            /* byte[5] */
            uint8_t reserve5; /*!< 备用位 40-47 */

            /* byte[6] */
            uint8_t reserve6; /*!< 备用位 48-55 */

            /* byte[7] */
            uint8_t reserve7; /*!< 备用位 56-63 */
        } signal;
    } __attribute__((packed)) can_data_u;
} __attribute__((packed)) hvs_fl_sts6_t;
#pragma pack()

// AS-HVS 结构体定义
typedef struct
{
    uint32_t can_id; /*!< CAN ID 0x211 */
    union
    {
        uint8_t bytes[8];
        struct
        {
            /* byte[0] 0-7 */
            uint64_t sas_switch_request         : 2; /*!< 自适应功能开关指令 0-1 */
            uint64_t sas_drvmode_switch_request : 2; /*!< 关联驾驶模式功能开关指令 2-3 */
            uint64_t as_sas_request_pneumatic   : 4; /*!< 自适应调节指令 4-7 */

            /* byte[1] 8-15 */
            uint64_t user_id                                  : 3; /*!< 乘客ID 8-10 */
            uint64_t as_heater_cooler_sw_pneumatic            : 3; /*!< 副驾座椅通风加热指令 11-13 */
            uint64_t as_thighsupport_manual_request_pneumatic : 2; /*!< 腿部手动调节指令 14-15 */

            /* byte[2] 16-23 */
            uint64_t as_bolstersupport_manual_request_pneumatic : 2; /*!< 侧翼手动调节指令 16-17 */
            uint64_t as_lumbar_f_r_manual_request_pneumatic     : 2; /*!< 腿托前后手动调节指令 18-19 */
            uint64_t as_lumbar_u_d_manual_request_pneumatic     : 2; /*!< 腿托上下手动调节指令 20-21 */
            uint64_t as_highsupport_manual_request_up_pneumatic : 2; /*!< 臀部骶骨气袋手动调节指令 22-23 */

            /* byte[3] 24-31 */
            uint64_t
                as_highsupport_manual_request_down_pneumatic : 2; /*!< 臀部软硬调节气袋手动调节指令 24-25 */
            uint64_t
                as_highsupport_manual_request_mid_pneumatic : 2;  /*!< 臀部中间双层气袋手动调节指令 26-27 */
            uint64_t as_sas_memory_set_request_drvive_pneumatic  : 1; /*!< 驾驶位自适应记忆设置指令 28 */
            uint64_t as_sas_memory_set_request_off_pneumatic     : 1; /*!< 离车位自适应记忆设置指令 29 */
            uint64_t as_sas_memory_set_request_relax_pneumatic   : 1; /*!< 休息位自适应记忆设置指令 30 */
            uint64_t as_sas_memory_set_request_reserve_pneumatic : 1; /*!< 备用位自适应记忆设置指令 31 */

            /* byte[4] 32-39 */
            uint64_t
                as_sas_memory_recall_request_drvive_pneumatic   : 2; /*!< 驾驶位自适应记忆执行指令 32-33 */
            uint64_t as_sas_memory_recall_request_off_pneumatic : 2; /*!< 离车位自适应记忆执行指令 34-35 */
            uint64_t
                as_sas_memory_recall_request_relax_pneumatic : 2;    /*!< 休息位自适应记忆执行指令 36-37 */
            uint64_t
                as_sas_memory_recall_request_reserve_pneumatic : 2;  /*!< 备用位自适应记忆执行指令 38-39 */

            /* byte[5] 40-47 */
            uint64_t as_drv_mode_state                      : 2; /*!< 驾驶模式 40-41 */
            uint64_t as_massage_mode_request_pneumatic      : 4; /*!< 副驾按摩模式指令 42-45 */
            uint64_t as_massage_intensity_request_pneumatic : 2; /*!< 副驾按摩力度指令 46-47 */

            /* byte[6] 48-54 */
            uint64_t as_massage_time_request_pneumatic         : 3; /*!< 副驾按摩时间指令 48-50 */
            uint64_t as_massage_switch_request_pneumatic       : 2; /*!< 副驾按摩开关指令 51-52 */
            uint64_t as_massage_popup_switch_request_pneumatic : 2; /*!< 按摩弹窗开关指令 53-54 */

            /* byte[6] 55, byte[7] 56-63 */
            uint64_t assengerseat_thinking_request_pneumatic : 4; /*!< 冥想模式指令 55-58 */
            uint64_t vehiclepower_pneumatic                  : 2; /*!< 整车电源状态 59-60 */
            uint64_t as_showroom_state_sps                   : 2; /*!< 主驾展厅模式状态 61-62 */
            uint64_t reserve1                                : 1; /*!< 备用位 63 */
        } signal;
    } can_data_u;
} hvs_fr_req1_t;

typedef struct
{
    uint32_t can_id; /*!< CAN ID 0x212 */
    union
    {
        uint8_t bytes[8];
        struct
        {
            /* byte[0] 0-5 */
            uint64_t as_massage_ctrl_request_1_pneumatic : 3; /*!< #1按摩气袋控制 0-2 */
            uint64_t as_massage_ctrl_request_2_pneumatic : 3; /*!< #2按摩气袋控制 3-5 */

            /* byte[0] 6-7, byte[1] 8-14 */
            uint64_t as_massage_ctrl_request_3_pneumatic : 3; /*!< #3按摩气袋控制 6-8 */
            uint64_t as_massage_ctrl_request_4_pneumatic : 3; /*!< #4按摩气袋控制 9-11 */
            uint64_t as_massage_ctrl_request_5_pneumatic : 3; /*!< #5按摩气袋控制 12-14 */

            /* byte[1] 15, byte[2] 16-23 */
            uint64_t as_massage_ctrl_request_6_pneumatic : 3; /*!< #6按摩气袋控制 15-17 */
            uint64_t as_massage_ctrl_request_7_pneumatic : 3; /*!< #7按摩气袋控制 18-20 */
            uint64_t as_massage_ctrl_request_8_pneumatic : 3; /*!< #8按摩气袋控制 21-23 */

            /* byte[3] 24-29 */
            uint64_t as_massage_ctrl_request_9_pneumatic  : 3; /*!< #9按摩气袋控制 24-26 */
            uint64_t as_massage_ctrl_request_10_pneumatic : 3; /*!< #10按摩气袋控制 27-29 */

            /* byte[3] 30-31, byte[4] 32-39 */
            uint64_t as_massage_ctrl_request_11_pneumatic : 3; /*!< #11按摩气袋控制 30-32 */
            uint64_t as_massage_ctrl_request_12_pneumatic : 3; /*!< #12按摩气袋控制 33-35 */
            uint64_t as_hip_mode1_request_pneumatic       : 2; /*!< 臀部模式1指令 36-37 */
            uint64_t as_hip_mode2_request_pneumatic       : 2; /*!< 臀部模式2指令 38-39 */

            /* byte[5] 40-47 */
            uint64_t as_hip_mode3_request_pneumatic           : 2; /*!< 臀部模式3指令 40-41 */
            uint64_t as_hip_mode4_request_pneumatic           : 2; /*!< 臀部模式4指令 42-43 */
            uint64_t as_thighsupport_ctrl_request_pneumatic   : 2; /*!< 腿部自动调节指令 44-45 */
            uint64_t as_bolstersupport_ctrl_request_pneumatic : 2; /*!< 侧翼自动调节指令 46-47 */

            /* byte[6] 48-55 */
            uint64_t as_lumbar_up_ctrl_request_pneumatic      : 2; /*!< 腰托上气袋自动调节指令 48-49 */
            uint64_t as_lumbar_dn_ctrl_request_pneumatic      : 2; /*!< 腰托下气袋自动调节指令 50-51 */
            uint64_t as_highsupport_ctrl_request_up_pneumatic : 2; /*!< 臀部骶骨气袋自动调节指令 52-53 */
            uint64_t
                as_highsupport_ctrl_request_down_pneumatic : 2; /*!< 臀部软硬调节气袋自动调节指令 54-55 */

            /* byte[7] 56-63 */
            uint64_t
                as_highsupport_ctrl_request_mid_pneumatic : 2; /*!< 臀部中间双层气袋自动调节指令 56-57 */
            uint64_t reserve1                             : 6; /*!< 备用位 58-63 */

        } signal;
    } can_data_u;
} hvs_fr_req2_t;

typedef struct
{
    uint32_t can_id; /*!< CAN ID 0x251 */
    union
    {
        uint8_t bytes[8];
        struct
        {
            /* byte[0] 0-7 */
            uint64_t sas_drvmode_switch_state_pneumatic : 2; /*!< 自适应关联驾驶模式功能开关状态 0-1 */
            uint64_t as_sas_state_pneumatic             : 4; /*!< 自适应调节状态 2-5 */
            uint64_t as_sas_pneumatic_to_sps_pneumatic  : 2; /*!< 首次乘坐调节指令 6-7 */

            /* byte[1] 8-15 */
            uint64_t as_heater_cooler_sw_feedback_pneumatic : 3; /*!< 副驾座椅通风加热状态反馈 8-10 */
            uint64_t reserve1                               : 1; /*!< 备用位 11 */
            uint64_t as_thighsupport_ctrl_state_pneumatic   : 2; /*!< 腿部支撑状态 12-13 */
            uint64_t as_bolstersupport_ctrl_state_pneumatic : 2; /*!< 侧翼支撑状态 14-15 */

            /* byte[2] 16-23 */
            uint64_t as_lumbar_ctrl_state_up_pneumatic      : 2; /*!< 腰托上气袋支撑状态 16-17 */
            uint64_t as_lumbar_ctrl_state_down_pneumatic    : 2; /*!< 腰托下气袋支撑状态 18-19 */
            uint64_t as_highsupport_ctrl_state_up_pneumatic : 2; /*!< 臀部支撑状态 up表示骶骨气袋 20-21 */
            uint64_t
                as_highsupport_ctrl_state_down_pneumatic : 2;    /*!< 臀部支撑状态 down表示下排气袋 22-23 */

            /* byte[3] 24-31 */
            uint64_t as_highsupport_ctrl_state_mid_pneumatic : 2; /*!< 臀部支撑状态 mid表示中排气袋 24-25 */
            uint64_t as_thighsupport_manual_state_pneumatic  : 2; /*!< 腿部手动调节状态 26-27 */
            uint64_t as_bolstersupport_manual_state_pneumatic : 2; /*!< 侧翼手动调节状态 28-29 */
            uint64_t as_lumbar_f_r_manual_state_pneumatic     : 2; /*!< 腰托前后手动调节状态 30-31 */

            /* byte[4] 32-39 */
            uint64_t as_lumbar_u_d_manual_state_pneumatic     : 2; /*!< 腰托上下手动调节状态 32-33 */
            uint64_t as_highsupport_manual_state_up_pneumatic : 2; /*!< 臀部骶骨手动调节状态 34-35 */
            uint64_t
                as_highsupport_manual_state_down_pneumatic : 2;    /*!<
                                                                      臀部硬度调节前后端两个大气袋手动调节状态
                                                                      36-37 */
            uint64_t
                as_hipsupport_manual_state_mid_pneumatic : 2; /*!< 臀部中间左右双层气袋手动调节状态 38-39 */

            /* byte[5] 40-47 */
            uint64_t as_sas_memory_set_state_driver_pneumatic  : 2; /*!< 驾驶位自适应记忆设置状态 40-41 */
            uint64_t as_sas_memory_set_state_off_pneumatic     : 2; /*!< 离开位自适应记忆设置状态 42-43 */
            uint64_t as_sas_memory_set_state_relax_pneumatic   : 2; /*!< 休息位自适应记忆设置状态 44-45 */
            uint64_t as_sas_memory_set_state_reserve_pneumatic : 2; /*!< 备用位自适应记忆设置状态 46-47 */

            /* byte[6] 48-55 */
            uint64_t as_air_pressure_memory_recall_state_pneumatic : 2; /*!< 气压达到记忆值 48-49 */
            uint64_t as_sas_memory_recall_state_driver_pneumatic : 2; /*!< 驾驶位自适应记忆执行状态 50-51 */
            uint64_t as_sas_memory_recall_state_off_pneumatic    : 2; /*!< 离开位自适应记忆执行状态 52-53 */
            uint64_t as_sas_memory_recall_state_relax_pneumatic  : 2; /*!< 休息位自适应记忆执行状态 54-55 */

            /* byte[7] 56-63 */
            uint64_t
                as_sas_memory_recall_state_reserve_pneumatic : 2; /*!< 备用位自适应记忆执行状态 56-57 */
            uint64_t as_sas_switch_state                     : 2; /*!< 自适应功能开关状态 58-59 */
            uint64_t reserve2                                : 4; /*!< 备用位 60-63 */
        } signal;
    } can_data_u;
} hvs_fr_sts1_t;

typedef struct
{
    uint32_t can_id; /*!< CAN ID 0x252 */
    union
    {
        uint8_t bytes[8];
        struct
        {
            /* byte[0] 0-5 */
            uint64_t as_massage_ctrl_status_1_pneumatic : 3; /*!< #1按摩气袋控制 0-2 */
            uint64_t as_massage_ctrl_status_2_pneumatic : 3; /*!< #2按摩气袋控制 3-5 */

            /* byte[0] 6-7, byte[1] 8-14 */
            uint64_t as_massage_ctrl_status_3_pneumatic : 3; /*!< #3按摩气袋控制 6-8 */
            uint64_t as_massage_ctrl_status_4_pneumatic : 3; /*!< #4按摩气袋控制 9-11 */
            uint64_t as_massage_ctrl_status_5_pneumatic : 3; /*!< #5按摩气袋控制 12-14 */

            /* byte[1] 15, byte[2] 16-23 */
            uint64_t as_massage_ctrl_status_6_pneumatic : 3; /*!< #6按摩气袋控制 15-17 */
            uint64_t as_massage_ctrl_status_7_pneumatic : 3; /*!< #7按摩气袋控制 18-20 */
            uint64_t as_massage_ctrl_status_8_pneumatic : 3; /*!< #8按摩气袋控制 21-23 */

            /* byte[3] 24-29 */
            uint64_t as_massage_ctrl_status_9_pneumatic  : 3; /*!< #9按摩气袋控制 24-26 */
            uint64_t as_massage_ctrl_status_10_pneumatic : 3; /*!< #10按摩气袋控制 27-29 */

            /* byte[3] 30-31, byte[4] 32-39 */
            uint64_t as_massage_ctrl_status_11_pneumatic : 3; /*!< #11按摩气袋控制 30-32 */
            uint64_t as_massage_ctrl_status_12_pneumatic : 3; /*!< #12按摩气袋控制 33-35 */
            uint64_t as_massage_mode_state_pneumatic     : 4; /*!< 副驾按摩模式状态 36-39 */

            /* byte[5] 40-47 */
            uint64_t as_massage_intensity_state_pneumatic : 2; /*!< 副驾按摩力度状态 40-41 */
            uint64_t as_massage_time_state_pneumatic      : 3; /*!< 副驾按摩时长状态 42-44 */
            uint64_t as_massage_switch_state_pneumatic    : 3; /*!< 副驾按摩开关状态 45-47 */

            /* byte[6] 48-53 */
            uint64_t as_massage_popup_switch_state_pneumatic : 2; /*!< 按摩弹出开关状态 48-49 */
            uint64_t as_thinkingmode_status_pneumatic        : 4; /*!< 冥想模式反馈 50-53 */

            /* byte[6] 54-55, byte[7] 56-63 */
            uint64_t as_massage_physicalswitch_state : 3; /*!< 副驾腰托按摩开关按键状态 54-56 */
            uint64_t reserve1                        : 7; /*!< 备用位 57-63 */

        } signal;
    } can_data_u;
} hvs_fr_sts2_t;

typedef struct
{
    uint32_t can_id; /*!< CAN ID 0x253 */
    union
    {
        uint8_t bytes[8];
        struct
        {
            /* byte[0] 0-7 */
            uint64_t software_version_1_0; /*!< 软件版本 0-7 */

            /* byte[1] 8-15 */
            uint64_t software_version_1_1; /*!< 软件版本 8-15 */

            /* byte[2] 16-23 */
            uint64_t software_version_1_2; /*!< 软件版本 16-23 */

            /* byte[3] 24-31 */
            uint64_t software_version_1_3; /*!< 软件版本 24-31 */

            /* byte[4] 32-39 */
            uint64_t as_lumbar_up_support_air_pressure_valve; /*!< 腰托上气袋气压值 32-39 */

            /* byte[5] 40-47 */
            uint64_t as_lumbar_down_support_air_pressure_valve; /*!< 腰托下气袋气压值 40-47 */

            /* byte[6] 48-55 */
            uint64_t as_thigh_support_air_pressure_valve; /*!< 腿托气袋气压值 48-55 */

            /* byte[7] 56-63 */
            uint64_t as_boloster_support_air_pressure_valve; /*!< 侧翼大气袋支撑气压值 56-63 */
        } signal;
    } can_data_u;
} hvs_fr_sts3_t;

typedef struct
{
    uint32_t can_id; /*!< CAN ID 0x254 */
    union
    {
        uint8_t bytes[8];
        struct
        {
            /* byte[0] 0-7 */
            uint64_t as_hightvolt_fault    : 1; /*!< 副驾过压故障 0 */
            uint64_t as_lowvolt_fault      : 1; /*!< 副驾欠压故障 1 */
            uint64_t as_eculinternal_fault : 1; /*!< ecu内部故障 2 */
            uint64_t as_heatopen_fault     : 1; /*!< 副驾加热供电回路开路故障 3 */
            uint64_t as_heatshort_fault    : 1; /*!< 副驾加热供电回路短路/过流故障 4 */
            uint64_t as_ntcopen_fault      : 1; /*!< 副驾NTC开路故障 5 */
            uint64_t as_ntcshort_fault     : 1; /*!< 副驾NTC短路故障 6 */
            uint64_t as_fanopen_fault      : 1; /*!< 副驾风扇供电回路开路故障 7 */

            /* byte[1] 8-15 */
            uint64_t as_fanshort_fault               : 1; /*!< 副驾风扇供电回路短路/过流故障 8 */
            uint64_t as_pumpopen_fault               : 1; /*!< 副驾气泵供电回路开路故障 9 */
            uint64_t as_pumpshort_fault              : 1; /*!< 副驾气泵供电回路短路/过流故障 10 */
            uint64_t as_physickey_fault              : 1; /*!< 副驾物理按键粘滞故障 11 */
            uint64_t as_thighsupport_bladder_fault   : 1; /*!< 副驾腿托气袋故障 12 */
            uint64_t as_bolstersupport_bladder_fault : 1; /*!< 副驾侧翼气袋故障 13 */
            uint64_t as_lumbar_up_bladder_fault      : 1; /*!< 副驾腰托上气袋故障 14 */
            uint64_t as_lumbar_down_bladder_fault    : 1; /*!< 副驾腰托下气袋故障 15 */

            /* byte[2] 16-23 */
            uint64_t as_bolster_left_bladder_fault  : 1; /*!< 副驾转向支撑左气袋故障 16 */
            uint64_t as_bolster_right_bladder_fault : 1; /*!< 副驾转向支撑右气袋故障 17 */
            uint64_t as_all_functions_fault         : 1; /*!< 副驾所有功能故障 18 */
            uint64_t reserve1                       : 5; /*!< 备用位 19-23 */

            /* byte[3] */
            uint64_t reserve2; /*!< 备用位 24-31 */

            /* byte[4] */
            uint64_t reserve3; /*!< 备用位 32-39 */

            /* byte[5] */
            uint64_t reserve4; /*!< 备用位 40-47 */

            /* byte[6] */
            uint64_t reserve5; /*!< 备用位 48-55 */

            /* byte[7] */
            uint64_t reserve6; /*!< 备用位 56-63 */
        } signal;
    } can_data_u;
} hvs_fr_sts4_t;

typedef struct
{
    uint32_t can_id; /*!< CAN ID 0x255 */
    union
    {
        uint8_t bytes[8];
        struct
        {
            /* byte[0] 0-7 */
            uint64_t as_boloster_left_air_pressure_valve; /*!< 左侧翼小气袋气压值 0-7 */

            /* byte[1] 8-15 */
            uint64_t as_boloster_right_air_pressure_valve; /*!< 右侧翼小气袋气压值 8-15 */

            /* byte[2] 16-23 */
            uint64_t as_hip_up_support_air_pressure_value; /*!< 臀部上气袋气压值 16-23 */

            /* byte[3] 24-31 */
            uint64_t as_hip_mid_support_air_pressure_value; /*!< 臀部中气袋气压值 24-31 */

            /* byte[4] 32-39 */
            uint64_t as_hip_down_support_air_pressure_value; /*!< 臀部下气袋气压值 32-39 */

            /* byte[5] 40-47 */
            uint64_t as_external_air_pressure_value; /*!< 外部大气压值 40-47 */

            /* byte[6] 48-55 */
            uint64_t as_hip_mode1_status_pneumatic : 2; /*!< 臀部模式1状态 48-49 */
            uint64_t as_hip_mode2_status_pneumatic : 2; /*!< 臀部模式2状态 50-51 */
            uint64_t as_hip_mode3_status_pneumatic : 2; /*!< 臀部模式3状态 52-53 */
            uint64_t as_hip_mode4_status_pneumatic : 2; /*!< 臀部模式4状态 54-55 */

            /* byte[7] 56-63 */
            uint64_t reserve1; /*!< 备用位 56-63 */
        } signal;
    } can_data_u;
} hvs_fr_sts5_t;

// #pragma pack()

extern hvs_fl_req1_t hvs_fl_req1;
extern hvs_fl_req2_t hvs_fl_req2;
extern hvs_fl_sts1_t hvs_fl_sts1;
extern hvs_fl_sts2_t hvs_fl_sts2;
extern hvs_fl_sts3_t hvs_fl_sts3;
extern hvs_fl_sts4_t hvs_fl_sts4;
extern hvs_fl_sts5_t hvs_fl_sts5;
extern hvs_fl_sts6_t hvs_fl_sts6;
extern msg_queue_t   sensor_msg_queue;
extern msg_frame_t   sensor_msg_frame_buf[];

void app_communication_init(void);
void app_communication_can_prepare_data(void);
void app_communication_can_send(void);
void app_communication_can_recv_handle(void);

#endif
